package opgave3;

/**
 * @author Andre Baart en Jeroen Castelein
 * @elementen 
 * 		Objecten van het type E
 * @structuur
 * 		Boomstructuur
 * @domein
 * 		Het type van alle objecten in de boom is identiek en de 
 *		objecten zijn monotoon niet-dalend als binaire zoekboom gesorteerd.
 * @constructor
 * 		BinaireZoekboom();
 * 			<dl>
 * 				<dt><b>PRE-conditie</b><dd>-
 * 				<dt><b>POST-conditie</b><dd>De inhoud van het nieuwe BinaireZoekboom-object is leeg.
 * 			</dl>
 **/

import java.util.Iterator;

public interface BinaireZoekboomInterface<E extends Data> extends Clonable {

	/** Initialiseert het BinaireZoekboom object tot de lege verzameling.
     * @preconditie
     *	    -
     * @postconditie
     *	    De BinaireZoekboom is leeg.
     **/
	void init();
	
	/** Voegt een kopie van data toe aan de zoekboom op de juiste plek volgens de sortering.
     * @preconditie
     *	    -
     * @postconditie
     *	    Een kopie van data zit in de zoekboom op de juiste plek volgens de sortering. 
     **/
	void add(E data);
	
	/** Retourneert of een kopie van data in de zoekboom zit en als dit het geval is wijst de current deze aan.
     * @preconditie
     *	    -
     * @postconditie
     *	    True - Een kopie van data zit in de zoekboom, current wijst naar deze kopie.
     *		False - Een kopie van data zit niet in de zoekboom
     **/
	boolean contains(E data);
	
	/** Verwijdert E data uit de boom.
     * @preconditie
     *	    Een kopie van E data zit in de boom.
     * @postconditie
     *	   	De meegegeven E data is verwijderd uit de boom.
     **/
	void remove(E data);
	
	/**
	 *  @postconditie
	 *  	De in de binaire zoekboom opgeslagen data zijn in 
	 *  	Monotoon niet-dalende volgorde doorlopen en in deze 
	 *  	volgorde in een object van het type Iterator gezet.
	 *  	Dit object van het type Iterator is daarna geretourneerd.
	 **/
	Iterator<E> ascendingIterator () ;
	
	/**
     *  @postconditie
	 *  	De in de binaire zoekboom opgeslagen data zijn in 
	 *  	monotoon niet-stijgende volgorde doorlopen en in deze 
	 *  	volgorde in een object van het type Iterator gezet.      
	 *  	Dit object van het type Iterator is daarna geretourneerd.
     **/
	Iterator<E> descendingIterator () ;
}
